package mx.itesm.pruebadmescenas;

import org.andengine.engine.Engine;
import org.andengine.engine.camera.Camera;
import org.andengine.opengl.texture.TextureOptions;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.vbo.VertexBufferObjectManager;

/**
 * Es una clase que se encarga de cargar/descargar los recursos bajo demanda
 * 
 * @author Roberto Martínez Román
 *
 */
public class ManejadorRecursos {
	private static final ManejadorRecursos INSTANCE = new ManejadorRecursos(); // Instancia
																				// única

	// Información del contexto
	public Engine engine;
	public ProyectoJuego actividadJuego; // La actividad que corre la aplicación
	public Camera camara;
	public VertexBufferObjectManager vbom;

	// ***** Texturas *****

	// Splash Screen
	public ITextureRegion splashRegion;
	private BitmapTextureAtlas splashTextureAtlas;

	// Menu Screen
	public ITextureRegion menuRegion;
	private BitmapTextureAtlas menuTextureAtlas;

	// Botón acerca de
	public ITextureRegion btnAcercaRegion;
	private BitmapTextureAtlas btnAcercaTextureAtlas;

	// Botón play
	public ITextureRegion btnPlayRegion;
	private BitmapTextureAtlas btnPlayTextureAtlas;

	// Botón REGRESAR
	public ITextureRegion btnRegresarRegion;
	private BitmapTextureAtlas btnRegresarTextureAtlas;

	// Fondo Acerca de
	public ITextureRegion acercaDeRegion;
	private BitmapTextureAtlas acercaDeTextureAtlas;

	// Juego - Enemigo
	public ITextureRegion enemigoRegion;
	private BitmapTextureAtlas enemigoTextureAtlas;

	// Juego - Personaje
	public ITextureRegion personajeRegion;
	private BitmapTextureAtlas personajeTextureAtlas;

	// Juego - Proyectil
	public ITextureRegion proyectilRegion;
	private BitmapTextureAtlas proyectilTextureAtlas;
	
	// Juego - Fondo
	public ITextureRegion fondoJuegoRegion;
	private BitmapTextureAtlas fondoJuegoTextureAtlas;

	// CALAVERA
	public ITextureRegion calaveraRegion;
	private BitmapTextureAtlas calaveraTextureAtlas;
	
	// Botón de pausa
		public ITextureRegion btnPausaRegion;
		private BitmapTextureAtlas btnPausaTextureAtlas;
		

	// Botones del control analógico
	// Base
	public ITextureRegion mOnScreenControlBaseRegion;
	private BitmapTextureAtlas mOnScreenControlBaseTexture;
	// Botón
	public ITextureRegion mOnScreenControlKnobRegion;
	private BitmapTextureAtlas mOnScreenControlKnobTexture;
	
	// Imágenes para partículas (humo)
	public ITextureRegion humoRegion;
	private BitmapTextureAtlas humoTextureAtlas;

	// ***** Métodos *****
	// Guarda el contexto del juego
	public static void inicializarManejador(Engine engine,
			ProyectoJuego actividad, Camera camara,
			VertexBufferObjectManager vbom) {
		getInstance().engine = engine;
		getInstance().actividadJuego = actividad;
		getInstance().camara = camara;
		getInstance().vbom = vbom;
	}

	// Crea y regresa la instancia única de la clase
	public static ManejadorRecursos getInstance() {
		return INSTANCE;
	}

	// Splash
	public void cargarRecursosSplash() {
		splashTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 480, 480,
				TextureOptions.BILINEAR);
		splashRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(
				splashTextureAtlas, actividadJuego, "logoTec_2.png", 0, 0);
		splashTextureAtlas.load();
	}

	public void liberarRecursosSplash() {
		splashTextureAtlas.unload();
		splashRegion = null;
	}

	// MENU
	public void cargarRecursosMenu() {
		menuTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 800, 480,
				TextureOptions.BILINEAR);
		menuRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(
				menuTextureAtlas, actividadJuego, "menu2.jpg", 0, 0);
		menuTextureAtlas.load();
	}

	public void liberarRecursosMenu() {
		menuTextureAtlas.unload();
		menuRegion = null;
	}

	// ACERCA DE
	public void cargarRecursosAcercaDe() {
		
		// Fondo
		acercaDeTextureAtlas = new BitmapTextureAtlas(
				//actividadJuego.getTextureManager(), 949, 327,
				actividadJuego.getTextureManager(), 800, 480,
				TextureOptions.BILINEAR);
		acercaDeRegion = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(acercaDeTextureAtlas, actividadJuego,
						//"fondo_about.png", 0, 0);
						"fh.png", 0, 0);
		acercaDeTextureAtlas.load();
		
		// Calavera
		calaveraTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 128, 128,
				TextureOptions.BILINEAR);
		calaveraRegion = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(calaveraTextureAtlas, actividadJuego,
						"calavera.png", 0, 0);
		calaveraTextureAtlas.load();

		// Botón REGRESAR
		btnRegresarTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 128, 128,
				TextureOptions.BILINEAR);
		btnRegresarRegion = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(btnRegresarTextureAtlas, actividadJuego,
						"atras.png", 0, 0);
		btnRegresarTextureAtlas.load();
		
		cargarRecursosHumo();
	}

	public void liberarRecursosAcercaDe() {
		acercaDeTextureAtlas.unload();
		acercaDeRegion = null;
		btnRegresarTextureAtlas.unload();
		btnRegresarRegion = null;
		
		liberarRecursosHumo();
	}

	// Botones
	public void cargarRecursosBotones() {
		btnAcercaTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 128, 128,
				TextureOptions.BILINEAR);
		btnAcercaRegion = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(btnAcercaTextureAtlas, actividadJuego,
						"about128.png", 0, 0);
		btnAcercaTextureAtlas.load();

		btnPlayTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 128, 128,
				TextureOptions.BILINEAR);
		btnPlayRegion = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(btnPlayTextureAtlas, actividadJuego,
						"play128.png", 0, 0);
		btnPlayTextureAtlas.load();

	}

	public void liberarRecursosBotones() {
		btnAcercaTextureAtlas.unload();
		btnPlayTextureAtlas.unload();
		btnPlayRegion = null;
		btnRegresarRegion = null;
	}

	// PERSONAJE
	public void cargarRecursosPersonaje() {
		personajeTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 90, 128,
				TextureOptions.BILINEAR);
		personajeRegion = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(personajeTextureAtlas, actividadJuego,
						"personaje.png", 0, 0);
		personajeTextureAtlas.load();
	}

	public void liberarRecursosPersonaje() {
		personajeTextureAtlas.unload();
		personajeRegion = null;
	}
	
	// FONDO del JUEGO
	public void cargarRecursosFondoJuego() {
		fondoJuegoTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 800, 480,
				TextureOptions.BILINEAR);
		fondoJuegoRegion = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(fondoJuegoTextureAtlas, actividadJuego,
						"menu.jpg", 0, 0);
		fondoJuegoTextureAtlas.load();
	}

	public void liberarRecursosFondoJuego() {
		fondoJuegoTextureAtlas.unload();
		fondoJuegoRegion = null;
	}

	// ENEMIGO
	public void cargarRecursosEnemigo() {
		enemigoTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 90, 128,
				TextureOptions.BILINEAR);
		enemigoRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(
				enemigoTextureAtlas, actividadJuego, "enemigo.png", 0, 0);
		enemigoTextureAtlas.load();
	}

	public void liberarRecursosEnemigo() {
		enemigoTextureAtlas.unload();
		enemigoRegion = null;
	}

	// Recursos del control analógico
	public void cargarRecursosControlAnalogo() {
		this.mOnScreenControlBaseTexture = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 128, 128,
				TextureOptions.BILINEAR);
		this.mOnScreenControlBaseRegion = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(mOnScreenControlBaseTexture, actividadJuego,
						"onscreen_control_base.png", 0, 0);
		this.mOnScreenControlBaseTexture.load();

		this.mOnScreenControlKnobTexture = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 64, 64,
				TextureOptions.BILINEAR);
		this.mOnScreenControlKnobRegion = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(mOnScreenControlKnobTexture, actividadJuego,
						"onscreen_control_knob.png", 0, 0);
		this.mOnScreenControlKnobTexture.load();
	}

	public void liberarRecursosControlAnalogo() {
		mOnScreenControlBaseTexture.unload();
		mOnScreenControlKnobTexture.unload();
		mOnScreenControlBaseRegion = null;
		mOnScreenControlKnobRegion = null;
	}
	
	// Flecha ROJA (proyectil)
	public void cargarRecursosProyectil() {
		proyectilTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 32, 32,
				TextureOptions.BILINEAR);
		proyectilRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(
				proyectilTextureAtlas, actividadJuego, "flechaRoja.png", 0, 0);
		proyectilTextureAtlas.load();
	}

	public void liberarRecursosProyectil() {
		proyectilTextureAtlas.unload();
		proyectilRegion = null;
	}

	// Juego
	public void cargarRecursosJuego() {
		cargarRecursosEnemigo();
		cargarRecursosPersonaje();
		cargarRecursosProyectil();
		cargarRecursosFondoJuego();
		// Cargar botón de pausa
		// Botón PAUSA
		btnPausaTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 64, 64,
				TextureOptions.BILINEAR);
		btnPausaRegion = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(btnPausaTextureAtlas, actividadJuego,
						"pausa.png", 0, 0);
		btnPausaTextureAtlas.load();
	}

	public void liberarRecursosJuego() {
		liberarRecursosEnemigo();
		liberarRecursosPersonaje();
		liberarRecursosProyectil();
		liberarRecursosFondoJuego();
		// Liberar botón de pusa
		btnPausaTextureAtlas.unload();
		btnPausaRegion = null;
	}
	
	// HUMO
	private void cargarRecursosHumo() {
		humoTextureAtlas = new BitmapTextureAtlas(
				actividadJuego.getTextureManager(), 64, 64,
				TextureOptions.BILINEAR);
		humoRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(
				humoTextureAtlas, actividadJuego, "smoke_01.png", 0, 0);
		humoTextureAtlas.load();
	}

	private void liberarRecursosHumo() {
		humoTextureAtlas.unload();
		humoRegion = null;
	}
}